// 场景定义
// 加载动画的场景
var loadScene = {
    key:'loadScene',
    active:true,
    // 预加载和创建两个函数
    preload: loadPreload,
    create: loadCreate,
}

// 游戏启动的场景
var gameStartScene = {
    key:'gameStartScene',
    // 创建和更新两个函数
    create: gameCreate,
    update: update
}
// 游戏结束的场景
var gameOverScene = {
    key:'gameOverScene',
    create:overCreate
}
// 设置全局配置
var config = {
    // 使用默认的渲染方式
    type: Phaser.AUTO,
    // 游戏画面的宽和高
    width: 288,
    height: 505,
    // 使用游乐场物理模型
    physics: {
        default: 'arcade',
        arcade: {
            // 重力设置为600
            gravity: { y: 600 },
            debug: false,
        }
    },
    // 多个场景，存入一个数组当中
    scene: [loadScene,gameStartScene,gameOverScene],
};
// 定义 管道   小鸟  地面   背景 分数显示文本对象 等变量
var platforms,play,ground,bg,scoreText = null
// 游戏是否结束
var OVER = false
// 管道速度
var groundSpeed = 0
// 背景速度
var bgSpeed = 0
// 得分
var score = 0
// 管道的速度 为负表示向左运动
var platformsSpeed = -200
// 管道的宽度
var pipesW = 54
// 管道的水平座标
var pipesX = config.width

var rd,topY,bottomY;

var game = new Phaser.Game(config);
// 设置加载的文字
function loadFn(){
    var width = this.cameras.main.width;
    var height = this.cameras.main.height;
    // 加载对象
    var loadingText = this.make.text({
        x: width / 2,
        y: height / 2 - 50,
        text: 'Loading...',
        style: {
            font: '50px monospace',
            fill: '#ffffff'
        }
    });
    loadingText.setOrigin(0.5, 0.5);
    // 百分比对象
    var percentText = this.make.text({
        x: width / 2,
        y: height / 2 - 5,
        text: '0%',
        style: {
            font: '18px monospace',
            fill: '#ffffff'
        }
    });
    //
    percentText.setOrigin(0.5, 0.5);

    // 完成一个进度100%文字的加载
    this.load.on('progress', function (value) {
        percentText.setText(parseInt(value * 100) + '%');
    });

    // 加载进度结束后，销毁 两个文本对象
    this.load.on('complete', function () {
        loadingText.destroy();
        percentText.destroy();
    });
}
// loadScene 中的 预加载
function loadPreload() {
    // 找到所有图片资源
    // 标题
    this.load.image('title','assets/title.png')
    // 启动按钮
    this.load.image('start-button','assets/start-button.png')
    // 玩法介绍
    this.load.image('instructions','assets/instructions.png')
    // 背景
    this.load.image('background','assets/background.png')
    // 管道
    this.load.image('ground','assets/ground.png')
    // 游戏结束图片
    this.load.image('gameover','assets/gameover.png')
    // 三个音频
    this.load.audio('score','assets/score.wav')
    this.load.audio('ground-hit','assets/ground-hit.wav')
    this.load.audio('pipe-hit','assets/pipe-hit.wav')
    // 管道图片
    this.load.spritesheet('pipes','assets/pipes.png',{frameWidth:pipesW,frameHeight:320})
    // 鸟图片
    this.load.spritesheet('bird','assets/bird.png',{frameWidth:34,frameHeight:24})
    //
    loadFn.call(this)
}
// loadScene 中的 创建
function loadCreate(){
    // 背景创建
    bg = this.add.tileSprite(config.width/2, config.height/2, config.width, config.height, 'background')

    // 标题 介绍 开始按钮 的创建
    var title =  this.add.image(config.width/2,100,'title')
    var instructions =  this.add.image(config.width/2,config.height/2,'instructions')
    var startButton = this.add.image(config.width/2,config.height-100,'start-button').setInteractive()

    // 鸟创建
    this.anims.create({
        key:'fly',
        frames:this.anims.generateFrameNumbers('bird',{start : 0,end : 2}),
        frameRate:10,
        repeat:-1,
    })

    // 绑定点击事件
    startButton.on('pointerdown', function (pointer) {
        // 隐藏初始场景内容
        title.destroy()
        instructions.destroy()
        startButton.destroy()
        // 切换游戏场景到gameStartScene
        game.scene.start('gameStartScene');
    });
}
// 创建管道的方法
function createPipes(){
    // 随机获得一个数字
    rd = Phaser.Math.Between(100,135)
    // 随机上方管道的纵坐标
    topY = Phaser.Math.Between(-40,20)
    // 随机下方管道的纵坐标
    bottomY = Phaser.Math.Between(380,440)
    // 水平座标加随机数，表示管道的间隔
    pipesX+=rd
    // 上下管道是对齐的，所以X坐标相等
    platforms.create(pipesX,topY,"pipes")
    // 下管道
    platforms.create(pipesX,bottomY,"pipes",1)
    //
    platforms.children.iterate(function(child){
        // 让管道不受重力影响
        child.body.allowGravity = false;
    })
    // 管道数量不足4根时，创建管道
    if(platforms.children.size<4){
        createPipes()
    }
}
//更新管道
function updatePipes(that){
    platforms.children.iterate(function(child){
        if(child.body.x < -pipesW){
            topY = Phaser.Math.Between(-60,0)
            bottomY = Phaser.Math.Between(400,460)
            if(child.body.y<20){
                // 更新分数
                score++
                scoreText.setText(score)
                // 播放得分的声音
                that.sound.play('score')
                child.body.reset(config.width,topY)
            }else{
                child.body.reset(config.width,bottomY)
            }
        }
    })
}
//
function gameCreate() {
    var that = this
    // 创建动态组
    platforms = this.physics.add.group()
    // 调用创建管道的方法
    createPipes()
    // tileSprite 平铺的精灵
    ground = this.add.tileSprite(config.width-335/2, config.height-112/2,335,112, 'ground')
    //
    ground = this.physics.add.existing(ground, 'staticSprite')
    // 设置分数的位置，初始值
    scoreText = this.add.text(10,10,score)
    // 设置分数的大小
    scoreText.setFontSize(36);
    // 创建鸟对象
    player = this.physics.add.sprite(100,100,'bird')
    //
    this.input.on('pointerdown', function(pointer, currentlyOver){
        // 如果游戏已经结束了，直接返回
        if(OVER) return;

        that.tweens.add({
            targets: player,
            duration:50,
            angle:-30,
        })
        //
        player.setVelocityY(-200)
    });
    // 执行飞行的行为
    player.anims.play('fly')
}

// 结束游戏sence 中 overCreate
function overCreate() {
    // 添加游戏结束的图片
    var title = this.add.image(config.width/2,100,'gameover')
    // 添加开始按钮 并设置
    var startButton = this.add.image(config.width/2,config.height-100,'start-button').setInteractive()
    var that = this
    // 点击启动按钮 游戏重启
    startButton.on('pointerdown', function (pointer) {
        OVER = false
        restart()
    });
}

// 重启游戏的方法
function restart(){
    // 获取随机数字
    rd = Phaser.Math.Between(100,135)
    pipesX+=rd
    platforms.children.entries[0].body.reset(pipesX,Phaser.Math.Between(-40,30))
    platforms.children.entries[1].body.reset(pipesX,Phaser.Math.Between(390,440))
    platforms.children.entries[2].body.reset(pipesX+rd,Phaser.Math.Between(-40,30))
    platforms.children.entries[3].body.reset(pipesX+rd,Phaser.Math.Between(390,440))
    // 鸟的起始坐标
    player.x = 100
    player.y = 100
    // 鸟的角度为0
    player.angle = 0
    player.anims.play('fly')
    scoreText.setText(score)
    game.scene.resume('gameStartScene');
}
function gameOver(that){
    // 更改变量的值
    OVER = true
    // 得分重置
    score = 0
    // 背景速度降为0
    bgSpeed = 0
    // 地面速度降为0
    groundSpeed = 0
    //
    pipesX = config.width
    // 鸟停止飞行
    player.anims.stop('fly')
    platforms.setVelocityX(0)
    // 启动游戏结束场景
    game.scene.start('gameOverScene');
}
//
function update() {
    var that = this
    // 游戏没有结束
    if(!OVER){
        //
        bgSpeed+=0.5
        //
        groundSpeed+=5
        //
        bg.tilePositionX = bgSpeed
        ground.tilePositionX =  groundSpeed
        updatePipes(this)
        platforms.setVelocityX(platformsSpeed)
        //
        if(player.angle < 90) player.angle += 2.5;
        this.physics.resume()
    }else{
        this.physics.pause()
    }
    //检测鸟和管道之间的重叠事件
    this.physics.add.overlap(player,platforms,function(){
        if(OVER) return;
        that.sound.play('pipe-hit')
        gameOver()
    })
    //检测鸟和地面之间的碰撞事件
    this.physics.add.collider(player,ground,function(){
        if(OVER) return;
        that.sound.play('ground-hit')
        gameOver()
    })
}
